home *** CD-ROM | disk | FTP | other *** search
- /***
- * aeCAvail.c
- *
- * This XFCN will take two parameters (assumed to be 4 character strings)
- * and try and see if there is a coer. handler between the two.
- *
- * Gordon Watts July '91 Copyright.
- *
- ***/
- #include <HyperXCmd.h>
-
- #define versionString (StringPtr) "\pAECAvailable v1.0 Gordon Watts Aug 1991"
- #define usageString (StringPtr) "\pAECAvailable <from-type> <to-type> \
- <isSystem|needDesc|refCon|procPtr|theError>"
- #define badParamStr (StringPtr) "\pUse arg ? for usage."
-
- /**
- * main
- *
- * Main routine for this xfunction.
- *
- **/
- pascal void main(XCmdPtr paramPtr)
- {
- Str255 theString;
- OSErr theErr;
- ProcPtr theHandler;
- long refCon;
- Boolean typeIsDesc, isSysHandler;
- OSType *fromType, *toType;
-
- /**
- ** See if we have only one parameter... if it is one of the
- ** ! or ?, return the string...
- **/
-
- if (paramPtr -> paramCount == 1) {
-
- switch (**(paramPtr -> params[0])) {
-
- case '!':
- paramPtr -> returnValue =
- PasToZero (paramPtr, versionString);
- return;
- break;
-
- case '?':
- paramPtr -> returnValue =
- PasToZero (paramPtr, usageString);
- return;
- break;
-
- }
- }
-
- /**
- ** Right, make sure we have three parameters...
- **/
-
- if (paramPtr -> paramCount != 3) {
- paramPtr -> returnValue = PasToZero (paramPtr, badParamStr);
- return;
- }
-
- /**
- ** Get the from type and the to type.
- **/
-
- fromType = (OSType*) *(paramPtr -> params[0]);
- toType = (OSType*) *(paramPtr -> params[1]);
-
- /**
- ** Init all the stuff...
- **/
-
- theHandler = 0;
- refCon = 0;
-
- /**
- ** Check to see if this is app defined...
- **/
-
- isSysHandler = false;
- theErr = AEGetCoercionHandler (*fromType, *toType, &theHandler,
- &refCon,
- &typeIsDesc, false);
-
-
- /**
- ** Next, if it isn't app defined, see if it is system
- ** defined...
- **/
-
- if (theErr != noErr) {
-
- isSysHandler = true;
- theErr = AEGetCoercionHandler (*fromType, *toType, &theHandler,
- &refCon,
- &typeIsDesc, true);
-
- }
-
- /**
- ** Next, pull out the proper info...
- **/
-
- switch (**(paramPtr -> params[2])) {
-
- case 'i':
- BoolToStr (paramPtr, isSysHandler, theString);
- break;
-
- case 'n':
- BoolToStr (paramPtr, typeIsDesc, theString);
- break;
-
- case 'r':
- NumToHex (paramPtr, refCon, 8, theString);
- break;
-
- case 'p':
- NumToHex (paramPtr, (long) theHandler, 8, theString);
- break;
-
- case 't':
- NumToStr (paramPtr, theErr, theString);
- break;
-
- default:
- paramPtr -> returnValue = PasToZero (paramPtr, badParamStr);
- return;
- break;
- }
-
- paramPtr -> returnValue = PasToZero (paramPtr, theString);
- return;
- }
-